package tsb.dtd;

import java.io.FileNotFoundException;
import tsb.sax.XMLReader;
import tsb.util.InvalidReadException;

/**
 *
 * toma el control del lector de bajo nivel
 * lo encapsula en un DTDReader de bajo nive;
 * solicita las reglas internas y externas leidas
 * genera el validador.
 */
public class DTDParser {

    private DTDReader dtdReader;
    private String[] reglasExternas;
    private String[] reglasInternas;
    private DTDValidador dtdValidador;

    public DTDParser(XMLReader reader) throws DTDException {
        try {
            this.dtdReader = new DTDReader(reader);
            this.reglasExternas = this.dtdReader.getReglasExternas();
            this.reglasInternas = this.dtdReader.getReglasInternas();
            this.tryGenerarValidadorDTD();
        } catch (InvalidReadException ex) {
            String msg = ex.getMessage();
            throw new DTDException(msg);
        } catch (FileNotFoundException ex) {
            String msg = ex.getMessage();
            throw new DTDException(msg);
        }
    }

    public DTDValidador getDtdValidador() {
        return dtdValidador;
    }

    private synchronized void tryGenerarValidadorDTD() throws DTDException {
        DTDGenerarValidador dtdValidatorGenerator = new DTDGenerarValidador();

        for (int i = 0; reglasExternas != null && i < reglasExternas.length; i++) {
            String regla = reglasExternas[i];
            dtdValidatorGenerator.tryGenerarValidador(regla, false);
        }

        for (int i = 0; reglasInternas != null && i < reglasInternas.length; i++) {
            String regla = reglasInternas[i];
            dtdValidatorGenerator.tryGenerarValidador(regla, true);
        }

        dtdValidatorGenerator.commit();
        this.dtdValidador = dtdValidatorGenerator.getDTDValidador();
    }
}
